package com.wjjun.base.ui.viewmodel

import androidx.databinding.ObservableList
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
import com.wjjun.base.ui.state.RecycleViewState
import com.wjjun.base.utils.ObArrayList
import me.tatarka.bindingcollectionadapter2.ItemBinding
import me.tatarka.bindingcollectionadapter2.OnItemBind

/**
 *
 * author : wangjunjun
 * date   : 2022/6/9
 * desc   :
 */
open class CollectionViewModel(onItemBinding: OnItemBind<BaseItemViewModel<*>>) : BaseViewModel() {

    //数据源
    private val items = ObArrayList<BaseItemViewModel<*>>()

    //绑定关系,多类型item就是通过这个实现的
    val itemBinding: ItemBinding<BaseItemViewModel<*>> = ItemBinding.of(onItemBinding)

    //RecycleView UI数据
    val state = RecycleViewState()

    //数据为空显示的内容
    var emptyListViewModel = EmptyItemViewModel()

    init {
        items.addOnListChangedCallback(object : ObservableList.OnListChangedCallback<ObservableList<BaseItemViewModel<*>>>() {

            override fun onChanged(sender: ObservableList<BaseItemViewModel<*>>?) {
                onDataChange()
            }

            //列表范围变化之后
            override fun onItemRangeChanged(sender: ObservableList<BaseItemViewModel<*>>?, positionStart: Int, itemCount: Int) {
                onDataChange()
            }

            override fun onItemRangeInserted(sender: ObservableList<BaseItemViewModel<*>>?, positionStart: Int, itemCount: Int) {
                //数据新增之后
                if (sender == null) {
                    return
                }
                if (sender.size == 1 && sender[0] == emptyListViewModel) { //如果插入后只有一个空的，则不做其他处理
                    return
                }
                onDataChange()
            }

            override fun onItemRangeMoved(sender: ObservableList<BaseItemViewModel<*>>?, fromPosition: Int, toPosition: Int, itemCount: Int) {
                //数据移动之后
                onDataChange()
            }

            override fun onItemRangeRemoved(sender: ObservableList<BaseItemViewModel<*>>?, positionStart: Int, itemCount: Int) {
                //数据删除之后
                onDataChange()
            }
        })
    }

    fun onDataChange() {
        if (isEmpty()) {
            if (!items.contains(emptyListViewModel)) {
                items.add(emptyListViewModel)
            }
        } else {
            items.remove(emptyListViewModel)
        }
    }

    fun setSpanSizeLookup(spanSizeLookup: SpanSizeLookup) {
        state.spanSizeLookup.set(spanSizeLookup)
    }

    fun getSpanCount(): Int {
        return state.spanCount.get() ?: 1
    }

    /**
     *  设置空界面的图标和文本
     */
    fun setEmpty(icon: Int, msg: String) {
        emptyListViewModel.let {
            it.icon.set(icon)
            it.msg.set(msg)
        }
    }

    fun getData(): ObArrayList<BaseItemViewModel<*>> {
        return items
    }

    fun setData(itemViewModels: Collection<BaseItemViewModel<*>>){
        items.clear()
        items.addAll(itemViewModels)
    }

    fun addAll(itemViewModels: Collection<BaseItemViewModel<*>>) {
        items.addAll(itemViewModels)
    }

    fun addItem(index: Int, itemViewModel: BaseItemViewModel<*>) {
        items.add(index, itemViewModel)
    }

    fun addItem(itemViewModel: BaseItemViewModel<*>) {
        items.add(itemViewModel)
    }

    fun removeAt(index: Int) {
        items.removeAt(index)
    }

    fun remove(itemViewModel: BaseItemViewModel<*>) {
        items.remove(itemViewModel)
    }

    fun removeAll(itemViewModels: Collection<BaseItemViewModel<*>>) {
        items.removeAll(itemViewModels)
    }

    fun size(): Int {
        return items.size
    }

    fun clear() {
        items.clear()
    }

    fun isEmpty(): Boolean {
        if (items.isEmpty()) {
            return true
        }
        if (items.size == 1 && items[0] == emptyListViewModel) {
            return true
        }
        return false
    }
}